Skip to content

플로이드#133

Merged
github-actions[bot] merged 1 commit into
mainfrom
oliver
Apr 14, 2026
Merged

플로이드#133
github-actions[bot] merged 1 commit into
mainfrom
oliver

Conversation

@snughnu
Copy link
Copy Markdown
Collaborator

@snughnu snughnu commented Apr 14, 2026

🔗 문제 링크

✔️ 소요된 시간

50m + 3m

⏰ 시간 복잡도

O(n^3)

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements the Floyd-Warshall algorithm for calculating all-pairs shortest paths. The review feedback suggests two primary optimizations: first, populating the distance matrix directly from the input to eliminate the memory overhead of an intermediate adjacency list; and second, aggregating the final output into a single string before printing to improve performance compared to multiple print calls in a loop.

Comment on lines +5 to +28
// 인접리스트
var graph: [[(node: Int, weight: Int)]] = Array(repeating: [], count: n+1)
for _ in 0..<m {
let line = readLine()!.split(separator: " ").compactMap { Int($0) }
let (a, b, c) = (line[0], line[1], line[2])

graph[a].append((node: b, weight: c))
}

// dist 초기화
var dist: [[Int]] = Array(repeating: Array(repeating: INF, count: n+1), count: n+1)
for i in 1...n {
dist[i][i] = 0
}

// graph 순회하면서 dist행렬 채우기
for i in 1...n {
for edge in graph[i] {
let destination = edge.node
let weight = edge.weight

dist[i][destination] = min(weight, dist[i][destination])
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

graph 인접 리스트를 생성한 뒤 다시 dist 행렬로 옮기는 과정은 메모리와 시간 측면에서 비효율적입니다. 입력을 읽으면서 직접 dist 행렬의 값을 최소값으로 갱신하도록 수정하면 코드가 더 간결해집니다.

// dist 초기화
var dist: [[Int]] = Array(repeating: Array(repeating: INF, count: n+1), count: n+1)
for i in 1...n {
    dist[i][i] = 0
}

// 입력 처리 및 dist 행렬 채우기
for _ in 0..<m {
    let line = readLine()!.split(separator: " ").compactMap { Int($0) }
    let (a, b, c) = (line[0], line[1], line[2])

    dist[a][b] = min(dist[a][b], c)
}

Comment on lines +40 to +50
for i in 1...n {
var row: [String] = []
for j in 1...n {
if dist[i][j] == INF {
row.append("0")
} else {
row.append(String(dist[i][j]))
}
}
print(row.joined(separator: " "))
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

반복문 내에서 print를 여러 번 호출하는 대신, mapjoined를 사용하여 전체 결과를 하나의 문자열로 구성한 뒤 한 번에 출력하는 것이 성능 면에서 더 유리합니다.

let result = (1...n).map { i in
    (1...n).map { j in
        dist[i][j] == INF ? "0" : String(dist[i][j])
    }.joined(separator: " ")
}.joined(separator: "\n")
print(result)

@github-actions github-actions Bot merged commit aed406e into main Apr 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant